package com.press.services;

import com.press.bean.TemplateBean;
import com.press.controllers.admin.PanelController;
import com.press.mapper.TemplateMapper;
import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.*;
import java.util.*;

/**
 * Created by dana on 2016/10/13.
 */
@Service("templateService")
public class TemplateService {
    @Resource(name = "templateMapper")
    private TemplateMapper templateMapper;
    private static Logger log = Logger.getLogger(PanelController.class);

    /**
     * 添加新模板
     * @param template
     */
    public void addtemplate(TemplateBean template){
        Map<String,String> para=new HashMap<>();
        para.put("template_id",template.getTemplate_id());
        para.put("template_file",template.getTemplate_file());
        para.put("template_date",template.getTemplate_date());
        templateMapper.addtemplate(para);
    }

    /**
     * 获得全部template
     * @return
     */
    public List<TemplateBean> getalltemplates(){
        return templateMapper.getalltemplates();
    }

    /**
     * 获得正在使用的模板
     * @return
     */
    public TemplateBean getusetemplate(){
        return templateMapper.getusetemplate();
    }

    /**
     * 修改模板
     * @param template_id
     * @return
     */
    public  boolean changetemplate(String template_id){
        if(template_id==null){
            return false;
        }
        templateMapper.changetemplate(template_id);
        return true;
    }

    /**
     * 判断上传的zip文件是否符合要求
     * 注：如果压缩文件夹中
     * 第一层目录下只有一个文件夹
     * 含有（index.jsp、content.jsp、search.jsp、taxonomy.jsp、user.jsp）
     * 则认为上传的zip文件符合要求
     * @param zipfilepath
     * @return
     */
    public boolean judgezip(String zipfilepath){
        int dircount=getZipDirCount(zipfilepath);
        if(dircount!=1){
            log.info("*************该压缩文件夹中含有"+dircount+"个文件夹，不符合要求");
            deleteZip(zipfilepath);
            return false;       //不含一个文件夹则认为不合格
        }
        List<String> allfilename=getZipFile(zipfilepath);
        List<String> files=formatFileName(allfilename);
        int count=0;
        for(String file:files){
            log.info("************file:"+file);
            if(file.equals("index.jsp")){
                count++;
            }
            if(file.equals("content.jsp")){
                count++;
            }
            if(file.equals("search.jsp")){
                count++;
            }
            if(file.equals("taxonomy.jsp")){
                count++;
            }
            if(file.equals("user.jsp")){
                count++;
            }
        }
        if(count==5){
            log.info("******************上传文件夹符合要求");
            return true;
        }
        deleteZip(zipfilepath);
        return false;
    }

    /**
     * 该方法用于删除文件
     * @param filepath
     * @return
     */
    public boolean deleteZip(String filepath){
        File file=new File(filepath);
        if(file.exists()){
            file.delete();
            log.info("*********deletezip 删除文件成功！");
            return true;
        }else{
            log.info("*********deletezip 删除文件失败！文件不存在！");
            return false;
        }
    }

    /**
     * 解压压缩包(解压zip)
     * @param zipFilePath 压缩文件路径
     * @param destDir 解压目录
     * @return 返回解压的第一个文件夹的地址 地址为空则解压失败
     */
    public String unZip(String zipFilePath, String destDir) {
        org.apache.tools.zip.ZipFile zipFile = null;
        if(!destDir.endsWith(File.separator)){
            destDir=destDir+File.separator;
        }
        String fristdir="";
        int count=0;
        try {
            BufferedInputStream bis = null;
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            zipFile = new org.apache.tools.zip.ZipFile(zipFilePath, "GBK");
            Enumeration<ZipEntry> zipEntries = zipFile.getEntries();
            File file, parentFile;
            org.apache.tools.zip.ZipEntry entry;
            byte[] cache = new byte[1024];
            while (zipEntries.hasMoreElements()) {
                entry = zipEntries.nextElement();
                System.out.println("解压目录####"+entry.getName());
                if(count==0){
                    fristdir=entry.getName().substring(0,entry.getName().indexOf("/"));
                    System.out.println("第一个目录："+entry.getName());
                }
                if (entry.isDirectory()) {
                    new File(destDir + entry.getName()).mkdirs();
                    if(count==0){
                        count++;
                    }
                    continue;
                }
                bis = new BufferedInputStream(zipFile.getInputStream(entry));
                file = new File(destDir + entry.getName());
                parentFile = file.getParentFile();
                if (parentFile != null && (!parentFile.exists())) {
                    parentFile.mkdirs();
                }
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos, 1024);
                int readIndex = 0;
                while ((readIndex = bis.read(cache, 0, 1024)) != -1) {
                    fos.write(cache, 0, readIndex);
                }
                bos.flush();
                bos.close();
                fos.close();
                bis.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }finally{
            try {
                zipFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return fristdir;
    }

    /**
     * 得到zip文件中所有文件名称
     * @param zipfilepath
     * @return
     */
    public List<String> getZipFile(String zipfilepath)
    {
        List<String> list=new ArrayList<>();
        ZipFile slf_zipFile=null;
        try {
            slf_zipFile=new ZipFile(zipfilepath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Enumeration e=slf_zipFile.getEntries();
        while(e.hasMoreElements())
        {
            ZipEntry slf_zipEntry=(ZipEntry)e.nextElement();
            if(!slf_zipEntry.isDirectory())
            {
                String filename=slf_zipEntry.getName().substring(slf_zipEntry.getName().lastIndexOf("/")+1, slf_zipEntry.getName().length());
                list.add(filename);
            }
        }
        try {
            slf_zipFile.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return list;
    }


    /**
     * 得到zip文件中所有文件夹个数
     * @param zipfilepath
     * @return
     */
    public int getZipDirCount(String zipfilepath)
    {
        Map<String,String> list=new HashMap<>();
        ZipFile slf_zipFile=null;
        try {
            slf_zipFile=new ZipFile(zipfilepath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Enumeration e=slf_zipFile.getEntries();
        while(e.hasMoreElements())
        {
            ZipEntry slf_zipEntry=(ZipEntry)e.nextElement();
            if(slf_zipEntry.isDirectory())
            {
                String filename=slf_zipEntry.getName().substring(0,slf_zipEntry.getName().indexOf("/"));
                list.put(filename,filename);
            }
        }
        try {
            slf_zipFile.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return list.size();
    }


    /**
     * 格式化文件名称（以.jsp结尾的文件名称）
     * @param zipfilename
     * @return
     */
    public List<String> formatFileName(List<String> zipfilename){
        List<String> result=new ArrayList<>();
        for(String filename:zipfilename){
            if(filename.endsWith(".jsp")){
                result.add(filename);
            }
        }
        return result;
    }

    /**
     * 判断模板中是否有名字重复的模板
     * 0表示没有 非0表示有
     * @param filename
     * @return
     */
    public int ifHasSameName(String filename){
        return templateMapper.ifHasSameName(filename);
    }

    public TemplateMapper getTemplateMapper() {
        return templateMapper;
    }

    public void setTemplateMapper(TemplateMapper templateMapper) {
        this.templateMapper = templateMapper;
    }
}
